package com.hmdp.utils;


import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;


//全局唯一id
// 0+31位时间戳+32位序列号（序列号通过redis生成 string的inc）
@Component
public class RedisWorker {

    /*
    开始时间戳，就是第一次使用该工具类的时间，时间戳会通过调用时的时间戳减去这个开始时间 得到
     */
    private static final long BEGIN_TIMESTAMP= LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
    /*
    时间戳所占位数
     */
    private static final int COUNTS_BIT=31;

    private StringRedisTemplate stringRedisTemplate;

    public RedisWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    public long nextId(String prefix){
        //获取时间戳
        LocalDateTime now = LocalDateTime.now();
        long now_timestamp = now.toEpochSecond(ZoneOffset.UTC);
        long timestamp=now_timestamp-BEGIN_TIMESTAMP;

        //获取序列号
        //使用前缀+当时时间作为key，序列号作为value（这样做的一个好处是，可以统计每天的新增用户量）
        String date=now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        String key="inc"+prefix+"+"+date;
        Long res = stringRedisTemplate.opsForValue().increment(key);

        //拼接 时间戳+序列号 并且返回
        return timestamp<<COUNTS_BIT|res;
    }
}
